package br.com.speedprevweb.dao.impl;

import br.com.speedprevweb.dao.PrevidenciaDao;
import br.com.speedprevweb.model.Previdencia;
import br.com.speedprevweb.util.HibernateUtil;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class PrevidenciaDaoImpl implements PrevidenciaDao {

  private boolean valid(Previdencia previdencia) {
    if (previdencia.getRzSocial().isEmpty()) {
      return false;
    } else if (previdencia.getNmFantasia().isEmpty()) {
      return false;
    } else if (previdencia.getUnidadeFederativa().getNmUf().isEmpty()) {
      return false;
    } else if (previdencia.getDsBairro().isEmpty()) {
      return false;
    } else {
      return !previdencia.getDsLogradouro().isEmpty();
    }

  }

  @Override
  public boolean inserir(Previdencia previdencia) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
      tx = session.beginTransaction();
      if (valid(previdencia)) {
        session.save(previdencia);
        tx.commit();
        return true;
      }
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
    return false;
  }

  @Override
  public boolean alterar(Previdencia previdencia) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
      tx = session.beginTransaction();
      if (valid(previdencia)) {
        session.update(previdencia);
        tx.commit();
        return true;
      }
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
    return false;
  }

  @Override
  public boolean excluir(Previdencia previdencia) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
      tx = session.beginTransaction();
      session.delete(previdencia);
      tx.commit();
      return true;
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }

  @Override
  public Previdencia getPrevidencia(Previdencia previdencia) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    String sql = "FROM Previdencia p where p.nuCnpj = :pnuCnpj";
    try {
      tx = session.beginTransaction();
      Query query = session.createQuery(sql);
      query.setString("pnuCnpj", previdencia.getNuCnpj());
      previdencia = (Previdencia) query.uniqueResult();
      tx.commit();
      return (Previdencia) query.uniqueResult();
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }

  @Override
  public List<Previdencia> listarTodos() {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    String sql = "FROM Previdencia p order by p.rzSocial";
    try {
      tx = session.beginTransaction();
      Query query = session.createQuery(sql);
      return query.list();
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }
  
  @Override
  public boolean salvar(Previdencia previdencia) {
    if (previdencia.getNuCnpj().isEmpty()) {
      return inserir(previdencia);
    } else {
      return alterar(previdencia);
    }
  }
}
